package gormx

import (
	"log"
	"os"
	"time"

	"fiberx/internal/global/configs"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var DB *gorm.DB

type Gormx struct{}

func New() *Gormx {
	return &Gormx{}
}
func (m *Gormx) Gormx(c *configs.Config) (DB *gorm.DB) {
	var dbconfig = c.Database.Default
	var err error
	// 设置日志级别
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			SlowThreshold: time.Second,
			LogLevel:      m.getLogLevel(c), // LogLevel 为info级别的时候会输出sql语句
		},
	)
	// 打开数据库连接
	DB, err = gorm.Open(mysql.Open(c.Database.Default.Link), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		log.Fatalf("failed to connect database: %v", err)
	}

	// 获取底层的数据库连接池
	sqlDB, err := DB.DB()
	if err != nil {
		log.Fatalf("failed to get sql.DB: %v", err)
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(dbconfig.MaxIdleConns)                                    // 最大空闲连接数
	sqlDB.SetMaxOpenConns(dbconfig.MaxOpenConns)                                    // 最大打开连接数
	sqlDB.SetConnMaxLifetime(time.Second * time.Duration(dbconfig.ConnMaxLifetime)) // 连接的最大存活时间

	// 测试数据库连接
	err = sqlDB.Ping()
	if err != nil {
		log.Fatalf("failed to ping database: %v", err)
	}
	// log.Println("Connected to the database successfully.")

	return DB
}

// 根据配置文件获取日志级别，从而判断是否输出sql
func (m *Gormx) getLogLevel(c *configs.Config) logger.LogLevel {
	if c.Database.Default.Debug {
		return logger.Info
	} else {
		return logger.Silent
	}
}

func init() {
	DB = New().Gormx(configs.C)
}
